技术经验 • dingxiao • 阅读数:4635 • 2019年7月8日 09:22
在进行clock项目中,遇到瓶颈,在需要长时间等待wifi连接时,gui被阻塞,用户体验很差,故想用多任务或多线程来解决。
#include "Thread.h"
#include "ThreadController.h"
设置多线程并运行
myThread.onRun(niceCallback);
myThread.setInterval(1000);
myThread.run();
线程运行,但主循环还是阻塞,说明没有真正实现多线程。
ESP32在arduino环境下天生就支持多任务操作,该多任务操作时基于FreeRTOS的。
参考网址:https://suda-morris.github.io/2018/05/30/freertos-introduce/#FreeRTOS%E4%BF%A1%E5%8F%B7%E9%87%8F
https://techtutorialsx.com/2017/05/06/esp32-arduino-creating-a-task/
https://techtutorialsx.com/2017/05/09/esp32-running-code-on-a-specific-core/
https://randomnerdtutorials.com/esp32-dual-core-arduino-ide/
任务的建立
xTaskCreate(
taskOne, /* Task function. */
"TaskOne", /* String with name of task. */
10000, /* Stack size in bytes. */
NULL, /* Parameter passed as input of the task */
1, /* Priority of the task. */
NULL);
上述方式建立的任务还是被主循环阻塞。
ESP32是双核处理器,还有一颗内核未使用,可通过在不同内核上创建任务API实现。
xTaskCreatePinnedToCore(
Check_Time, /* Task function. */
"Check_Time", /* String with name of task. */
10000, /* Stack size in bytes. */
NULL, /* Parameter passed as input of the task */
1, /* Priority of the task. */
&Task1,
0);
void Check_Time(void * parameter)
{
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
NTP_Tick = NTP_Tick + 1;
if(NTP_Tick > 10)
break;
delay(500);
}
dialog_str = "Fail";
dialog_dis_delay_flag = true;
if(WiFi.status() == WL_CONNECTED)
{
Serial.println(" CONNECTED");
//init and get the time
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
Get_NTP_Flag = getLocalTime(&timeinfo);
dialog_str = "Succ";
//disconnect WiFi as it's no longer needed
WiFi.disconnect(true);
WiFi.mode(WIFI_OFF);
NTP_Tick = 0;
Serial.println("Wifi Out");
Serial.println("thread run");
Serial.println(xPortGetCoreID());
vTaskDelete( NULL );
}
通过打印回调函数运行的内核,可判断ESP32是否已启用双内核。
Serial.println(xPortGetCoreID());